setImmediate与nextTick 您所在的位置:网站首页 nexttick node setImmediate与nextTick

setImmediate与nextTick

2023-01-15 18:10| 来源: 网络整理| 查看: 265

Node.js版本0.10今天发布并推出 setImmediate.该API的变化文档建议做递归时使用它nextTick调用.

从MDN看起来它看起来非常相似process.nextTick.

我nextTick应该何时使用,何时使用setImmediate?

问题回答

使用setImmediate如果要排队的任何I/O事件回调中已经存在的事件队列后面的功能.用于process.nextTick在事件队列的头部有效地对函数进行排队,以便在当前函数完成后立即执行.

因此,在您尝试使用递归分解长时间运行的CPU绑定作业的情况下,您现在希望使用setImmediate而不是process.nextTick排队下一次迭代,否则任何I/O事件回调都不会有机会在迭代之间运行.

问题回答

作为例证

import fs from 'fs'; import http from 'http'; const options = { host: 'www.stackoverflow.com', port: 80, path: '/index.html' }; describe('deferredExecution', () => { it('deferredExecution', (done) => { console.log('Start'); setTimeout(() => console.log('TO1'), 0); setImmediate(() => console.log('IM1')); process.nextTick(() => console.log('NT1')); setImmediate(() => console.log('IM2')); process.nextTick(() => console.log('NT2')); http.get(options, () => console.log('IO1')); fs.readdir(process.cwd(), () => console.log('IO2')); setImmediate(() => console.log('IM3')); process.nextTick(() => console.log('NT3')); setImmediate(() => console.log('IM4')); fs.readdir(process.cwd(), () => console.log('IO3')); console.log('Done'); setTimeout(done, 1500); }); });

将给出以下输出

Start Done NT1 NT2 NT3 TO1 IO2 IO3 IM1 IM2 IM3 IM4 IO1

我希望这有助于理解其中的差异.

问题回答

我想我可以很好地说明这一点.由于nextTick在当前操作结束时调用,因此递归调用它最终会阻止事件循环继续.setImmediate通过在事件循环的检查阶段触发来解决这个问题,允许事件循环正常继续.

????????????????????????? ??>? timers ? ? ????????????????????????? ? ????????????????????????? ? ? I/O callbacks ? ? ????????????????????????? ? ????????????????????????? ? ? idle, prepare ? ? ????????????????????????? ????????????????? ? ????????????????????????? ? incoming: ? ? ? poll ?


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有